home *** CD-ROM | disk | FTP | other *** search
/ Freelog 115 / FreelogNo115-MaiJuin2013.iso / Internet / Filezilla Server / FileZilla_Server-0_9_41.exe / source / interface / UsersDlgSharedFolders.cpp < prev    next >
C/C++ Source or Header  |  2011-11-06  |  18KB  |  641 lines

  1. // FileZilla Server - a Windows ftp server
  2.  
  3. // Copyright (C) 2002-2004 - Tim Kosse <tim.kosse@gmx.de>
  4.  
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9.  
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14.  
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. #include "stdafx.h"
  20. #include "FileZilla server.h"
  21. #include "UsersDlgSharedFolders.h"
  22. #include "misc\sbdestination.h"
  23. #include "entersomething.h"
  24. #include "UsersDlg.h"
  25.  
  26. #if defined(_DEBUG) && !defined(MMGR)
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31.  
  32. /////////////////////////////////////////////////////////////////////////////
  33. // Dialogfeld CUsersDlgSharedFolders 
  34.  
  35. CUsersDlgSharedFolders::CUsersDlgSharedFolders(CUsersDlg* pOwner) 
  36.     : CSAPrefsSubDlg(IDD)
  37. {
  38.     m_pOwner = pOwner;
  39.     
  40.     //{{AFX_DATA_INIT(CUsersDlgSharedFolders)
  41.     m_bDirsCreate = FALSE;
  42.     m_bDirsDelete = FALSE;
  43.     m_bDirsList = FALSE;
  44.     m_bDirsSubdirs = FALSE;
  45.     m_bFilesAppend = FALSE;
  46.     m_bFilesDelete = FALSE;
  47.     m_bFilesRead = FALSE;
  48.     m_bFilesWrite = FALSE;
  49.     //}}AFX_DATA_INIT
  50. }
  51.  
  52. CUsersDlgSharedFolders::~CUsersDlgSharedFolders()
  53. {
  54. }
  55.  
  56.  
  57. void CUsersDlgSharedFolders::DoDataExchange(CDataExchange* pDX)
  58. {
  59.     CSAPrefsSubDlg::DoDataExchange(pDX);
  60.     //{{AFX_DATA_MAP(CUsersDlgSharedFolders)
  61.     DDX_Control(pDX, IDC_DIRS_CREATE, m_cDirsCreate);
  62.     DDX_Control(pDX, IDC_DIRS_DELETE, m_cDirsDelete);
  63.     DDX_Control(pDX, IDC_DIRS_LIST, m_cDirsList);
  64.     DDX_Control(pDX, IDC_DIRS_SUBDIRS, m_cDirsSubdirs);
  65.     DDX_Control(pDX, IDC_FILES_READ, m_cFilesRead);
  66.     DDX_Control(pDX, IDC_FILES_WRITE, m_cFilesWrite);
  67.     DDX_Control(pDX, IDC_FILES_DELETE, m_cFilesDelete);
  68.     DDX_Control(pDX, IDC_FILES_APPEND, m_cFilesAppend);
  69.     DDX_Control(pDX, IDC_DIRS, m_cDirs);
  70.     DDX_Check(pDX, IDC_DIRS_CREATE, m_bDirsCreate);
  71.     DDX_Check(pDX, IDC_DIRS_DELETE, m_bDirsDelete);
  72.     DDX_Check(pDX, IDC_DIRS_LIST, m_bDirsList);
  73.     DDX_Check(pDX, IDC_DIRS_SUBDIRS, m_bDirsSubdirs);
  74.     DDX_Check(pDX, IDC_FILES_APPEND, m_bFilesAppend);
  75.     DDX_Check(pDX, IDC_FILES_DELETE, m_bFilesDelete);
  76.     DDX_Check(pDX, IDC_FILES_READ, m_bFilesRead);
  77.     DDX_Check(pDX, IDC_FILES_WRITE, m_bFilesWrite);
  78.     //}}AFX_DATA_MAP
  79. }
  80.  
  81.  
  82. BEGIN_MESSAGE_MAP(CUsersDlgSharedFolders, CSAPrefsSubDlg)
  83.     //{{AFX_MSG_MAP(CUsersDlgSharedFolders)
  84.     ON_WM_CONTEXTMENU()
  85.     ON_NOTIFY(LVN_ITEMCHANGED, IDC_DIRS, OnItemchangedDirs)
  86.     ON_NOTIFY(LVN_ITEMCHANGING, IDC_DIRS, OnItemchangingDirs)
  87.     ON_COMMAND(ID_DIRMENU_ADD, OnDirmenuAdd)
  88.     ON_COMMAND(ID_DIRMENU_REMOVE, OnDirmenuRemove)
  89.     ON_COMMAND(ID_DIRMENU_RENAME, OnDirmenuRename)
  90.     ON_COMMAND(ID_DIRMENU_SETASHOMEDIR, OnDirmenuSetashomedir)
  91.     ON_COMMAND(ID_DIRMENU_EDITALIASES, OnDirmenuEditAliases)
  92.     ON_NOTIFY(LVN_ENDLABELEDIT, IDC_DIRS, OnEndlabeleditDirs)
  93.     ON_NOTIFY(NM_DBLCLK, IDC_DIRS, OnDblclkDirs)
  94.     ON_BN_CLICKED(IDC_FILES_WRITE, OnFilesWrite)
  95.     ON_BN_CLICKED(IDC_DIRADD, OnDiradd)
  96.     ON_BN_CLICKED(IDC_DIRREMOVE, OnDirremove)
  97.     ON_BN_CLICKED(IDC_DIRRENAME, OnDirrename)
  98.     ON_BN_CLICKED(IDC_DIRSETASHOME, OnDirsetashome)
  99.     //}}AFX_MSG_MAP
  100. END_MESSAGE_MAP()
  101.  
  102. /////////////////////////////////////////////////////////////////////////////
  103. // Behandlungsroutinen fⁿr Nachrichten CUsersDlgSharedFolders 
  104.  
  105. BOOL CUsersDlgSharedFolders::OnInitDialog() 
  106. {
  107.     CSAPrefsSubDlg::OnInitDialog();
  108.     
  109.     m_cDirs.InsertColumn(0, _T("Directories"), LVCFMT_LEFT, 120);
  110.     m_cDirs.InsertColumn(1, _T("Aliases"), LVCFMT_LEFT, 200);
  111.     UpdateData(FALSE);
  112.     
  113.     m_imagelist.Create( 16, 16, ILC_MASK, 3, 3 );
  114.     HICON icon;
  115.     icon = AfxGetApp()->LoadIcon(IDI_EMPTY);
  116.     m_imagelist.Add(icon);
  117.     DestroyIcon(icon);
  118.     icon = AfxGetApp()->LoadIcon(IDI_HOME);
  119.     m_imagelist.Add(icon);
  120.     DestroyIcon(icon);
  121.     
  122.     m_cDirs.SetImageList(&m_imagelist, LVSIL_SMALL);
  123.  
  124.     m_cDirs.SetExtendedStyle(LVS_EX_FULLROWSELECT);
  125.  
  126.     SetCtrlState();
  127.  
  128.     return TRUE;  // return TRUE unless you set the focus to a control
  129.                   // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurⁿckgeben
  130. }
  131.  
  132. CString CUsersDlgSharedFolders::Validate()
  133. {
  134.     UpdateData(TRUE);
  135.  
  136.     t_user* pUser = m_pOwner->GetCurrentUser();
  137.     if (!pUser)
  138.         return _T("");
  139.  
  140.     if (pUser->group == _T("") && pUser->permissions.empty())
  141.     {
  142.         m_cDirs.SetFocus();
  143.         return _T("You need to share at least one directory and set it as home directory.");
  144.     }
  145.  
  146.     bool hasHome = false;
  147.     for (std::vector<t_directory>::iterator iter = pUser->permissions.begin(); iter != pUser->permissions.end(); iter++)
  148.     {
  149.         if (iter->dir == _T("") || iter->dir == _T("/") || iter->dir == _T("\\"))
  150.         {
  151.             m_cDirs.SetFocus();
  152.             return _T("At least one shared directory is not a valid local path.");
  153.         }
  154.  
  155.         if (iter->bIsHome)
  156.         {
  157.             hasHome = true;
  158.             iter->aliases.clear();
  159.         }
  160.     }
  161.  
  162.     if (!hasHome && pUser->group == _T(""))
  163.     {
  164.         m_cDirs.SetFocus();
  165.         return _T("You need to set a home directory");
  166.     }
  167.  
  168.     return _T("");
  169. }
  170.  
  171. void CUsersDlgSharedFolders::OnContextMenu(CWnd* pWnd, CPoint point) 
  172. {
  173.     if (pWnd==&m_cDirs)
  174.     {
  175.         CMenu menu;
  176.         menu.LoadMenu(IDR_DIRCONTEXT);
  177.  
  178.         CMenu* pPopup = menu.GetSubMenu(0);
  179.         ASSERT(pPopup != NULL);
  180.         CWnd* pWndPopupOwner = this;
  181.         //while (pWndPopupOwner->GetStyle() & WS_CHILD)
  182.         //    pWndPopupOwner = pWndPopupOwner->GetParent();
  183.         
  184.         if (!m_cDirs.GetFirstSelectedItemPosition())
  185.         {
  186.             pPopup->EnableMenuItem(ID_DIRMENU_REMOVE, MF_GRAYED);
  187.             pPopup->EnableMenuItem(ID_DIRMENU_RENAME, MF_GRAYED);
  188.             pPopup->EnableMenuItem(ID_DIRMENU_SETASHOMEDIR, MF_GRAYED);
  189.             pPopup->EnableMenuItem(ID_DIRMENU_EDITALIASES, MF_GRAYED);
  190.         }
  191.         if (point.x == -1)
  192.             GetCursorPos(&point);
  193.         pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  194.             pWndPopupOwner);
  195.     }
  196. }
  197.  
  198. void CUsersDlgSharedFolders::OnItemchangedDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  199. {
  200.     NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  201.     t_user *pUser = m_pOwner->GetCurrentUser();
  202.     if (!pUser)
  203.         return;
  204.     
  205.     int nItem = pNMListView->iItem;
  206.     POSITION selpos=m_cDirs.GetFirstSelectedItemPosition();
  207.     if (selpos)
  208.     {
  209.         if (m_cDirs.GetNextSelectedItem(selpos) != nItem)
  210.             return;
  211.     }
  212.     int index=pNMListView->lParam;
  213.     if (nItem!=-1)
  214.     {
  215.         m_bFilesRead = pUser->permissions[index].bFileRead;
  216.         m_bFilesWrite = pUser->permissions[index].bFileWrite;
  217.         m_bFilesDelete = pUser->permissions[index].bFileDelete;
  218.         m_bFilesAppend = pUser->permissions[index].bFileAppend;
  219.         m_bDirsCreate = pUser->permissions[index].bDirCreate;
  220.         m_bDirsDelete = pUser->permissions[index].bDirDelete;
  221.         m_bDirsList = pUser->permissions[index].bDirList;
  222.         m_bDirsSubdirs = pUser->permissions[index].bDirSubdirs;
  223.     }
  224.     UpdateData(FALSE);
  225.  
  226.     SetCtrlState();    
  227.     *pResult = 0;
  228. }
  229.  
  230. void CUsersDlgSharedFolders::OnItemchangingDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  231. {
  232.     *pResult = 0;
  233.     UpdateData(TRUE);
  234.     t_user *pUser = m_pOwner->GetCurrentUser();
  235.     if (!pUser)
  236.         return;
  237.         
  238.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  239.     if (selpos)
  240.     {
  241.         int item = m_cDirs.GetNextSelectedItem(selpos);
  242.         int index = m_cDirs.GetItemData(item);
  243.         pUser->permissions[index].bFileRead = m_bFilesRead;
  244.         pUser->permissions[index].bFileWrite = m_bFilesWrite;
  245.         pUser->permissions[index].bFileDelete = m_bFilesDelete;
  246.         pUser->permissions[index].bFileAppend = m_bFilesAppend;
  247.         pUser->permissions[index].bDirCreate = m_bDirsCreate;
  248.         pUser->permissions[index].bDirDelete = m_bDirsDelete;
  249.         pUser->permissions[index].bDirList = m_bDirsList;
  250.         pUser->permissions[index].bDirSubdirs = m_bDirsSubdirs;
  251.     }
  252. }
  253.  
  254. void CUsersDlgSharedFolders::SetCtrlState()
  255. {
  256.     t_user *pUser = m_pOwner->GetCurrentUser();
  257.     if (!pUser)
  258.     {
  259.         m_cDirs.EnableWindow(FALSE);
  260.         m_cFilesRead.EnableWindow(FALSE);
  261.         m_cFilesWrite.EnableWindow(FALSE);
  262.         m_cFilesDelete.EnableWindow(FALSE);
  263.         m_cFilesAppend.EnableWindow(FALSE);
  264.         m_cDirsCreate.EnableWindow(FALSE);
  265.         m_cDirsDelete.EnableWindow(FALSE);
  266.         m_cDirsList.EnableWindow(FALSE);
  267.         m_cDirsSubdirs.EnableWindow(FALSE);
  268.         GetDlgItem(IDC_DIRADD)->EnableWindow(FALSE);
  269.         GetDlgItem(IDC_DIRREMOVE)->EnableWindow(FALSE);
  270.         GetDlgItem(IDC_DIRRENAME)->EnableWindow(FALSE);
  271.         GetDlgItem(IDC_DIRSETASHOME)->EnableWindow(FALSE);
  272.  
  273.         m_bFilesAppend = m_bFilesDelete = m_bFilesRead = m_bFilesWrite = FALSE;
  274.         m_bDirsCreate = m_bDirsDelete = m_bDirsList = m_bDirsSubdirs = FALSE;
  275.         UpdateData(FALSE);
  276.     }
  277.     else
  278.     {
  279.         m_cDirs.EnableWindow(TRUE);
  280.         GetDlgItem(IDC_DIRADD)->EnableWindow(TRUE);
  281.         
  282.         if (m_cDirs.GetFirstSelectedItemPosition())
  283.         {
  284.             m_cFilesRead.EnableWindow(TRUE);
  285.             m_cFilesWrite.EnableWindow(TRUE);
  286.             m_cFilesDelete.EnableWindow(TRUE);
  287.             if (m_bFilesWrite)
  288.                 m_cFilesAppend.EnableWindow(TRUE);
  289.             else
  290.                 m_cFilesAppend.EnableWindow(FALSE);
  291.             m_cDirsCreate.EnableWindow(TRUE);
  292.             m_cDirsDelete.EnableWindow(TRUE);
  293.             m_cDirsList.EnableWindow(TRUE);
  294.             m_cDirsSubdirs.EnableWindow(TRUE);
  295.             GetDlgItem(IDC_DIRREMOVE)->EnableWindow(TRUE);
  296.             GetDlgItem(IDC_DIRRENAME)->EnableWindow(TRUE);
  297.             GetDlgItem(IDC_DIRSETASHOME)->EnableWindow(TRUE);
  298.         }
  299.         else
  300.         {
  301.             m_bFilesAppend = m_bFilesDelete = m_bFilesRead = m_bFilesWrite = FALSE;
  302.             m_bDirsCreate = m_bDirsDelete = m_bDirsList = m_bDirsSubdirs = FALSE;
  303.             UpdateData(FALSE);
  304.             m_cFilesRead.EnableWindow(FALSE);
  305.             m_cFilesWrite.EnableWindow(FALSE);
  306.             m_cFilesDelete.EnableWindow(FALSE);
  307.             m_cFilesAppend.EnableWindow(FALSE);
  308.             m_cDirsCreate.EnableWindow(FALSE);
  309.             m_cDirsDelete.EnableWindow(FALSE);
  310.             m_cDirsList.EnableWindow(FALSE);
  311.             m_cDirsSubdirs.EnableWindow(FALSE);
  312.             GetDlgItem(IDC_DIRREMOVE)->EnableWindow(FALSE);
  313.             GetDlgItem(IDC_DIRRENAME)->EnableWindow(FALSE);
  314.             GetDlgItem(IDC_DIRSETASHOME)->EnableWindow(FALSE);
  315.         }
  316.     }
  317. }
  318.  
  319. void CUsersDlgSharedFolders::OnDirmenuAdd() 
  320. {
  321.     t_user *pUser = m_pOwner->GetCurrentUser();
  322.     if (!pUser)
  323.         return;
  324.     
  325.     t_directory dir;
  326.     dir.bFileRead = dir.bDirList = dir.bDirSubdirs = TRUE;
  327.     dir.bDirCreate = dir.bDirDelete = 
  328.         dir.bFileAppend = dir.bFileDelete = 
  329.         dir.bAutoCreate = dir.bFileWrite = 
  330.         dir.bIsHome = FALSE;
  331.     dir.dir = _T("");
  332.     if (pUser->group == _T("") && !m_cDirs.GetItemCount())
  333.         dir.bIsHome = TRUE;
  334.     else
  335.         dir.bIsHome = FALSE;
  336.  
  337.     pUser->permissions.push_back(dir);
  338.     int nItem = m_cDirs.InsertItem(LVIF_TEXT |LVIF_PARAM|LVIF_IMAGE, 0, _T("<new directory>"), 0, 0, dir.bIsHome?1:0, pUser->permissions.size()-1);
  339.     m_cDirs.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
  340.     m_cDirs.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
  341.     m_cDirs.SetFocus();
  342.     OnDblclkDirs(0, 0);    
  343. }
  344.  
  345. void CUsersDlgSharedFolders::OnDirmenuRemove() 
  346. {
  347.     t_user *pUser = m_pOwner->GetCurrentUser();
  348.     if (!pUser)
  349.         return;
  350.  
  351.     POSITION selpos;
  352.     selpos = m_cDirs.GetFirstSelectedItemPosition();
  353.     if (!selpos)
  354.         return;
  355.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  356.     int index = m_cDirs.GetItemData(nItem);
  357.     m_cDirs.DeleteItem(nItem);
  358.     int i = 0;
  359.     for (std::vector<t_directory>::iterator iter = pUser->permissions.begin(); iter != pUser->permissions.end(); ++iter, ++i)
  360.         if (i == index)
  361.         {
  362.             pUser->permissions.erase(iter);
  363.             break;
  364.         }
  365.     for (i = 0; i < m_cDirs.GetItemCount(); i++)
  366.     {
  367.         int data = m_cDirs.GetItemData(i);
  368.         if (data > index)
  369.         {
  370.             m_cDirs.SetItemData(i, data - 1);
  371.         }
  372.     }
  373.     SetCtrlState();
  374. }
  375.  
  376. void CUsersDlgSharedFolders::OnDirmenuRename() 
  377. {
  378.     t_user *pUser = m_pOwner->GetCurrentUser();
  379.     if (!pUser)
  380.         return;
  381.  
  382.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  383.     if (!selpos)
  384.         return;
  385.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  386.     
  387.     m_cDirs.SetFocus();
  388.     m_cDirs.EditLabel(nItem);
  389. }
  390.  
  391. void CUsersDlgSharedFolders::OnDirmenuSetashomedir() 
  392. {
  393.     t_user *pUser = m_pOwner->GetCurrentUser();
  394.     if (!pUser)
  395.         return;
  396.  
  397.     POSITION selpos;
  398.     selpos = m_cDirs.GetFirstSelectedItemPosition();
  399.     if (!selpos)
  400.         return;
  401.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  402.     
  403.     for (unsigned int j = 0; j<pUser->permissions.size(); j++)
  404.     {
  405.         LVITEM item;
  406.         memset(&item, 0, sizeof(item));
  407.         item.mask = LVIF_IMAGE|LVIF_PARAM;
  408.         item.iItem = j;
  409.         m_cDirs.GetItem(&item);
  410.         item.iImage = (j == (unsigned int)nItem) ? 1 : 0;
  411.         pUser->permissions[item.lParam].bIsHome = 0;
  412.         m_cDirs.SetItem(&item);
  413.     }
  414.     int index = m_cDirs.GetItemData(nItem);
  415.     pUser->permissions[index].bIsHome = 1;
  416. }
  417.  
  418. void CUsersDlgSharedFolders::OnEndlabeleditDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  419. {
  420.     LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  421.     if (pDispInfo->item.pszText)
  422.     {
  423.         if (pDispInfo->item.pszText[0] == 0)
  424.         {
  425.             AfxMessageBox(_T("Please select a folder!"));
  426.             *pResult = FALSE;
  427.         }
  428.         else
  429.         {
  430.             t_user *pUser = m_pOwner->GetCurrentUser();
  431.             if (!pUser)
  432.                 return;
  433.             pUser->permissions[pDispInfo->item.lParam].dir = pDispInfo->item.pszText;
  434.             *pResult = TRUE;
  435.         }    
  436.     }
  437.     else
  438.     {
  439.         if (m_cDirs.GetItemText(pDispInfo->item.iItem, 0) == _T(""))
  440.         {
  441.             t_user *pUser = m_pOwner->GetCurrentUser();
  442.             if (!pUser)
  443.                 return;
  444.             
  445.             m_cDirs.DeleteItem(pDispInfo->item.iItem);
  446.             int i=0;
  447.             for (std::vector<t_directory>::iterator iter = pUser->permissions.begin(); iter != pUser->permissions.end(); iter++, i++)
  448.                 if (i == pDispInfo->item.lParam)
  449.                 {
  450.                     pUser->permissions.erase(iter);
  451.                     break;
  452.                 }
  453.         }
  454.     }
  455. }
  456.  
  457. void CUsersDlgSharedFolders::OnDblclkDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  458. {
  459.     t_user *pUser = m_pOwner->GetCurrentUser();
  460.     if (!pUser)
  461.         return;
  462.     
  463.     NMITEMACTIVATE *pItemActivate = (NMITEMACTIVATE *)pNMHDR;
  464.  
  465.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  466.     if (!selpos)
  467.         return;
  468.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  469.     int index = m_cDirs.GetItemData(nItem);
  470.  
  471.     if (!pItemActivate || !pItemActivate->iSubItem)
  472.     {
  473.         if (m_pOwner->IsLocalConnection())
  474.         {
  475.             CSBDestination sb(m_hWnd, IDS_BROWSEFORFOLDER);
  476.             sb.SetFlags(BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT);
  477.             sb.SetInitialSelection(m_cDirs.GetItemText(nItem, 0));
  478.             if (sb.SelectFolder())
  479.             {
  480.                 m_cDirs.SetItemText(nItem, 0, sb.GetSelectedFolder());
  481.                 pUser->permissions[index].dir = sb.GetSelectedFolder();
  482.             }
  483.         }
  484.         else
  485.         {
  486.             m_cDirs.SetFocus();
  487.             m_cDirs.EditLabel(nItem);
  488.         }
  489.     }
  490.     else
  491.         OnDirmenuEditAliases();
  492.     
  493.     if (pResult)
  494.         *pResult = 0;
  495. }
  496.  
  497. void CUsersDlgSharedFolders::OnFilesWrite() 
  498. {
  499.     UpdateData(TRUE);
  500.     SetCtrlState();    
  501. }
  502.  
  503. void CUsersDlgSharedFolders::OnDiradd() 
  504. {
  505.     OnDirmenuAdd();    
  506. }
  507.  
  508. void CUsersDlgSharedFolders::OnDirremove() 
  509. {
  510.     OnDirmenuRemove();    
  511. }
  512.  
  513. void CUsersDlgSharedFolders::OnDirrename() 
  514. {
  515.     OnDirmenuRename();    
  516. }
  517.  
  518. void CUsersDlgSharedFolders::OnDirsetashome() 
  519. {
  520.     OnDirmenuSetashomedir();    
  521. }
  522.  
  523. BOOL CUsersDlgSharedFolders::PreTranslateMessage(MSG* pMsg) 
  524. {
  525.     if (pMsg->message==WM_KEYDOWN)
  526.     {
  527.         if (pMsg->wParam==VK_F2)
  528.         {
  529.             if (GetFocus() == &m_cDirs)
  530.             {
  531.                 if (m_cDirs.GetEditControl())
  532.                     return TRUE;
  533.                 OnDirmenuRename();
  534.             }
  535.             return TRUE;
  536.         }
  537.     }
  538.     return CSAPrefsSubDlg::PreTranslateMessage(pMsg);
  539. }
  540.  
  541. BOOL CUsersDlgSharedFolders::DisplayUser(t_user *pUser)
  542. {
  543.     if (!pUser)
  544.     {
  545.         m_cDirs.DeleteAllItems();
  546.         m_bFilesRead = m_bFilesWrite = m_bFilesDelete = m_bFilesAppend = FALSE;
  547.         m_bDirsCreate = m_bDirsList = m_bDirsDelete = m_bDirsSubdirs = FALSE;
  548.         return TRUE;
  549.     }
  550.     
  551.     UpdateData(FALSE);
  552.     
  553.     //Fill the dirs list
  554.     m_cDirs.DeleteAllItems();
  555.     for (unsigned int j=0; j<pUser->permissions.size(); j++)
  556.     {
  557.         int nItem = m_cDirs.InsertItem(j, pUser->permissions[j].dir);
  558.         LVITEM item;
  559.         memset(&item,0,sizeof(item));
  560.         item.mask = LVIF_IMAGE | LVIF_PARAM;
  561.         item.iItem = nItem;
  562.         m_cDirs.GetItem(&item);
  563.         item.lParam = j;
  564.         item.iImage = pUser->permissions[j].bIsHome?1:0;
  565.         m_cDirs.SetItem(&item);
  566.  
  567.         CString aliases;
  568.         for (std::list<CString>::const_iterator iter = pUser->permissions[j].aliases.begin(); iter != pUser->permissions[j].aliases.end(); iter++)
  569.             aliases += *iter + "|";
  570.         aliases.TrimRight('|');
  571.         m_cDirs.SetItemText(nItem, 1, aliases);
  572.     }
  573.  
  574.     return TRUE;
  575. }
  576.  
  577. BOOL CUsersDlgSharedFolders::SaveUser(t_user *pUser)
  578. {
  579.     if (!pUser)
  580.         return FALSE;
  581.     
  582.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  583.     if (selpos)
  584.     {
  585.         int item = m_cDirs.GetNextSelectedItem(selpos);
  586.         int index = m_cDirs.GetItemData(item);
  587.         pUser->permissions[index].bFileRead = m_bFilesRead;
  588.         pUser->permissions[index].bFileWrite = m_bFilesWrite;
  589.         pUser->permissions[index].bFileDelete = m_bFilesDelete;
  590.         pUser->permissions[index].bFileAppend = m_bFilesAppend;
  591.         pUser->permissions[index].bDirCreate = m_bDirsCreate;
  592.         pUser->permissions[index].bDirDelete = m_bDirsDelete;
  593.         pUser->permissions[index].bDirList = m_bDirsList;
  594.         pUser->permissions[index].bDirSubdirs = m_bDirsSubdirs;
  595.     }        
  596.     return TRUE;
  597. }
  598.  
  599. void CUsersDlgSharedFolders::OnDirmenuEditAliases()
  600. {
  601.     t_user *pUser = m_pOwner->GetCurrentUser();
  602.     if (!pUser)
  603.         return;
  604.     
  605.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  606.     if (!selpos)
  607.         return;
  608.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  609.     int index = m_cDirs.GetItemData(nItem);
  610.  
  611.     if (pUser->permissions[index].bIsHome)
  612.     {
  613.         AfxMessageBox(_T("Can't set aliases for home dir, this would create a recursive directory structure."));
  614.         return;
  615.     }
  616.  
  617.     CEnterSomething dlg(IDS_SHAREDFOLDERS_ENTERALIASES, IDD_ENTERSOMETHING_LARGE);
  618.     dlg.m_String = m_cDirs.GetItemText(nItem, 1);
  619.     dlg.allowEmpty = true;
  620.     if (dlg.DoModal() == IDOK)
  621.     {
  622.         CString aliases = dlg.m_String;
  623.         while (aliases.Replace(_T("||"), _T("|")));
  624.         aliases.TrimLeft(_T("|"));
  625.         aliases.TrimRight(_T("|"));
  626.         m_cDirs.SetItemText(nItem, 1, aliases);
  627.         
  628.         pUser->permissions[index].aliases.clear();
  629.         aliases += _T("|");
  630.         int pos;
  631.         do 
  632.         {
  633.             pos = aliases.Find(_T("|"));
  634.  
  635.             CString alias = aliases.Left(pos);
  636.             if (alias != _T(""))
  637.                 pUser->permissions[index].aliases.push_back(alias);
  638.             aliases = aliases.Mid(pos + 1);
  639.         } while (pos != -1);
  640.     }
  641. }